home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / commodore-scene-files / Coverdisks / CDU / V3D08.D64 / macro editor (.txt) < prev    next >
Encoding:
Commodore BASIC  |  2019-04-13  |  15.0 KB  |  537 lines

  1. 100 REM * MACRO EDITOR  *
  2. 110 REM * FOR USE WITH  *
  3. 120 REM * SID SEQUENCER *
  4. 130 REM * BY V.H.BERRY  *
  5. 140 REM *    C.1989     *
  6. 200 GOSUB 50010:REM INITIALISATION
  7. 210 GOSUB 35010:REM MAIN MENU
  8. 220 PRINT"[147]MACRO EDITOR."
  9. 230 PRINT"V.H.BERRY."
  10. 240 PRINT"C.1989."
  11. 250 END
  12. 5000 REM TEMPO CHANGE
  13. 5010 VL=PEEK(49275):VL=VL+I:IF VL=256 THEN VL=1
  14. 5020 IF VL=0 THEN VL=255
  15. 5030 POKE 49275,VL:POKE 49276,0
  16. 5040 RETURN
  17. 6000 REM SEQUENCER ON/OFF
  18. 6010 IF MF=0 THEN MF=1:SYS 49235:RETURN
  19. 6020 MF=0:SYS 49209:RETURN
  20. 15000 REM BLOCK EDITOR
  21. 15010 GOSUB 27010:REM EDIT SCREEN
  22. 15100 GET K$:IF K$="" THEN 15100
  23. 15102 IF K$="" THEN GOSUB 16030:SY=SY+1:GOSUB 16010:REM EDIT CURSOR DOWN
  24. 15104 IF K$="[145]" THEN GOSUB 16030:SY=SY-1:GOSUB 16010:REM EDIT CURSOR UP
  25. 15106 IF K$="" THEN GOSUB 16030:SX=SX+1:GOSUB 16010:REM EDIT CURSOR RIGHT
  26. 15108 IF K$="[157]" THEN GOSUB 16030:SX=SX-1:GOSUB 16010:REM EDIT CURSOR LEFT
  27. 15110 IF K$="[147]" THEN GOSUB 16510:GOSUB 27010:REM CLEAR CHANNEL
  28. 15120 IF K$="" THEN GOSUB 17010:GOSUB 27010:REM DELETE BLOCK
  29. 15130 IF K$="" THEN GOSUB 18010:REM WRITE BLOCK
  30. 15135 IF K$="" THEN GOSUB 16610:REM SET BEGIN MARKER
  31. 15136 IF K$="" THEN GOSUB 16610:REM SET END MARKER
  32. 15140 IF K$="    " THEN GOSUB 17510:REM INSERT BLOCK
  33. 15145 IF K$="" THEN POKE FSID,0:POKE FSID+7,0:POKE FSID+14,0:REM RESET NOTE COUNTERS
  34. 15150 IF K$="F" THEN GOSUB 30010:GOSUB 27010:REM CHANGE FILENAME
  35. 15160 IF K$="P" THEN PG=PG+1:GOSUB 27010:REM NEXT PAGE
  36. 15165 IF K$="[208]" THEN PG=PG-1:GOSUB 27010:REM PREVIOUS PAGE
  37. 15167 IF K$="+" THEN I=-1:GOSUB 5010:REM INCREASE TEMPO
  38. 15168 IF K$="-" THEN I=1:GOSUB 5010:REM DECREASE TEMPO
  39. 15170 IF K$=CHR$(133) THEN OS=OS+1:GOSUB 27010:REM F1 NEXT CHANNEL
  40. 15180 IF K$=CHR$(134) THEN GOSUB 28010:REM F3 HELP SCREEN
  41. 15190 IF K$=CHR$(135) THEN GOSUB 6010:REM F5 SEQUENCER ON/OFF
  42. 15200 IF K$=CHR$(136) THEN RETURN:REM F7 EXIT
  43. 15210 GOTO 15100
  44. 16000 REM CURSOR CONTROL
  45. 16010 IF SX>7 THEN SX=0
  46. 16015 IF SX<0 THEN SX=7
  47. 16020 IF SY>7 THEN SY=0
  48. 16025 IF SY<0 THEN SY=7
  49. 16030 Y$="":PRINT"";
  50. 16040 FOR I=0 TO SY
  51. 16050 PRINT"";
  52. 16060 NEXT
  53. 16070 FOR I=0 TO SX
  54. 16080 PRINT"";
  55. 16090 NEXT
  56. 16100 OPEN 1,3
  57. 16110 FOR I=1 TO 3
  58. 16120 GET#1,X$
  59. 16130 Y$=Y$+X$
  60. 16140 NEXT
  61. 16150 CLOSE 1
  62. 16155 IF FG=0 THEN PRINT"";:FG=1:GOTO 16160
  63. 16156 FG=0
  64. 16160 PRINT"[157][157][157]";Y$;"[146]"
  65. 16170 RETURN
  66. 16500 REM CLEAR CHANNEL
  67. 16510 PRINT" CLEAR CHANNEL DATA : PRESS [RETURN] [146]"
  68. 16520 GET K$:IF K$="" THEN 16520
  69. 16530 IF K$<>CHR$(13) THEN K$="":RETURN
  70. 16540 N(OS)=0
  71. 16550 POKE CH+(OS-1)*256,128
  72. 16560 POKE CH+(OS-1)*256+1,255
  73. 16570 RETURN
  74. 16600 REM SET BLOCK MARKERS
  75. 16610 VL=PG*64+SY*8+SX:IF VL>=N(OS) THEN RETURN
  76. 16620 IF K$="" THEN BM=VL
  77. 16630 IF K$="" THEN EM=VL
  78. 16640 GOSUB 16710:REM PRINT BLOCK VALUES
  79. 16650 GOSUB 21030:REM COLOUR SUBROUTINE
  80. 16660 RETURN
  81. 16700 REM PRINT BLOCK MARKER VALUES
  82. 16710 PRINT"                    [145]"
  83. 16720 PRINT"BLOCK:";BM+1;"-";EM+1
  84. 16730 RETURN
  85. 17000 REM DELETE BLOCK
  86. 17010 PRINT" DELETE BLOCK [146]  "
  87. 17020 IF BM>EM THEN 18310:REM BLOCK ERROR
  88. 17030 IF MF=1 THEN GOSUB 6010:REM SEQ. OFF
  89. 17040 I=0
  90. 17050 POKE CH+(OS-1)*256+BM+I,PEEK(CH+(OS-1)*256+EM+I+1)
  91. 17060 IF PEEK(CH+(OS-1)*256+BM+I)=255 THEN N(OS)=N(OS)-(EM-BM+1):RETURN
  92. 17070 I=I+1
  93. 17080 GOTO 17050
  94. 17500 REM INSERT BLOCK
  95. 17510 VL=PG*64+SY*8+SX:IF VL>N(OS) THEN RETURN
  96. 17520 IF VL>254 OR N(OS)+EM-BM>255 THEN 18410:REM OVERFLOW
  97. 17525 IF BM>EM THEN 18310:REM BLOCK ERROR
  98. 17526 PRINT" INSERT BLOCK [146]  "
  99. 17530 IF MF=1 THEN GOSUB 6010:REM SEQ. OFF
  100. 17540 FOR I=N(OS)+1 TO VL STEP -1
  101. 17550 POKE CH+(OS-1)*256+I+(EM-BM)+1,PEEK(CH+(OS-1)*256+I)
  102. 17560 NEXT
  103. 17570 IF BM>VL THEN GOSUB 18110:REM COPY UP
  104. 17575 IF EM<VL THEN GOSUB 18210:REM COPY DOWN
  105. 17580 N(OS)=N(OS)+(EM-BM)+1
  106. 17590 GOSUB 27010:REM EDIT SCREEN
  107. 17600 RETURN
  108. 18000 REM WRITE BLOCK
  109. 18010 VL=PG*64+SY*8+SX:IF VL>N(OS) THEN RETURN
  110. 18020 IF VL>254 OR VL+EM-BM>254 THEN 18410:REM OVERFLOW
  111. 18025 IF BM>EM THEN 18310:REM BLOCK ERROR
  112. 18026 PRINT" WRITE BLOCK [146]   "
  113. 18030 IF MF=1 THEN GOSUB 6010:REM SEQ. OFF
  114. 18040 IF EM<VL OR BM>VL THEN GOSUB 18110:REM COPY UP
  115. 18050 IF EM>VL OR BM<VL THEN GOSUB 18210:REM COPY DOWN
  116. 18060 IF VL+EM-BM<N(OS) THEN 18090
  117. 18070 N(OS)=VL+EM-BM+1
  118. 18080 POKE CH+(OS-1)*256+N(OS),255
  119. 18090 GOSUB 27010:REM EDIT SCREEN
  120. 18095 RETURN
  121. 18100 REM COPY UP
  122. 18110 I=0
  123. 18120 FOR J=BM TO EM
  124. 18130 IF K$="" THEN POKE CH+(OS-1)*256+VL+I,PEEK(CH+(OS-1)*256+J)
  125. 18135 IF K$="    " THEN POKE CH+(OS-1)*256+VL+I,PEEK(CH+(OS-1)*256+J+(EM-BM)+1)
  126. 18140 I=I+1
  127. 18150 NEXT
  128. 18160 RETURN
  129. 18200 REM COPY DOWN
  130. 18210 I=0
  131. 18220 FOR J=EM TO BM STEP -1
  132. 18230 POKE CH+(OS-1)*256+VL+EM-BM+I,PEEK(CH+(OS-1)*256+J)
  133. 18240 I=I-1
  134. 18250 NEXT
  135. 18260 RETURN
  136. 18300 REM BLOCK MARKER ERROR
  137. 18310 PRINT" BLOCK MARKER ERROR [146]"
  138. 18320 GOSUB 21030:REM COLOUR SUBROUTINE
  139. 18330 RETURN
  140. 18400 REM DATA OVERFLOW ERROR
  141. 18410 PRINT" OVERFLOW ERROR [146]"
  142. 18420 GOSUB 21030:REM COLOUR SUBROUTINE
  143. 18430 RETURN
  144. 21000 REM COLOUR SUBROUTINE
  145. 21030 IF OS>3 THEN OS=1
  146. 21040 IF OS=1 THEN PRINT""
  147. 21050 IF OS=2 THEN PRINT"[158]"
  148. 21060 IF OS=3 THEN PRINT""
  149. 21070 RETURN
  150. 27000 REM NOTE EDIT SCREEN
  151. 27010 PRINT"[147] NEXT CHAN  HELP  SEQ ON/OFF  EXIT "
  152. 27020 PRINT"     F1      F3       F5       F7  "
  153. 27070 PRINT"[176][192][192][192][178][192][192][192][178][192][192][192][178][192][192][192][178][192][192][192][178][192][192][192][178][192][192][192][178][192][192][192][174]"
  154. 27080 PRINT"}1}2}3}4}5}6}7}8}"
  155. 27090 PRINT"[176]```{```{```{```{```{```{```{```{```[179]"
  156. 27100 PRINT"}0+}}}}}}}}}"
  157. 27110 PRINT"[171]```{```{```{```{```{```{```{```{```[179]"
  158. 27120 PRINT"}8+}}}}}}}}}"
  159. 27130 PRINT"[171]```{```{```{```{```{```{```{```{```[179]"
  160. 27140 PRINT"}16+}}}}}}}}}"
  161. 27150 PRINT"[171]```{```{```{```{```{```{```{```{```[179]"
  162. 27160 PRINT"}24+}}}}}}}}}"
  163. 27170 PRINT"[171]```{```{```{```{```{```{```{```{```[179]"
  164. 27180 PRINT"}32+}}}}}}}}}"
  165. 27190 PRINT"[171]```{```{```{```{```{```{```{```{```[179]"
  166. 27200 PRINT"}40+}}}}}}}}}"
  167. 27210 PRINT"[171]```{```{```{```{```{```{```{```{```[179]"
  168. 27220 PRINT"}48+}}}}}}}}}"
  169. 27230 PRINT"[171]```{```{```{```{```{```{```{```{```[179]"
  170. 27240 PRINT"}56+}}}}}}}}}"
  171. 27250 PRINT"[173]```[177]```[177]```[177]```[177]```[177]```[177]```[177]```[177]```[189]"
  172. 27260 PRINT"FILE:";N$
  173. 27265 GOSUB 16710:REM PRINT BLOCK VALUES
  174. 27270 GOSUB 21030:REM COLOUR SUBROUTINE
  175. 27280 PRINT"CHANNEL:";OS
  176. 27285 IF PG*64>N(OS) THEN PG=0
  177. 27286 IF PG<0 THEN PG=INT((N(OS)-1)/64)
  178. 27290 PRINT"NOTES:PAGE:[145]"
  179. 27300 PRINT TAB(9);N(OS);TAB(24);PG*64+1;"-";(PG+1)*64
  180. 27302 REM INITIALISE CURSOR CONTROLS
  181. 27304 SX=0:SY=0:FG=0
  182. 27310 REM PRINT NOTE DATA
  183. 27320 I=0:LL=0:PRINT"";
  184. 27330 VL=PEEK(CH+(OS-1)*256+PG*64+I)
  185. 27340 IF VL=128 THEN NL$="R  ":GOTO 27385:REM REST
  186. 27350 IF VL=255 THEN NL$=":  ":GOTO 27385:REM END OF DATA
  187. 27360 GOSUB 27510:REM NOTE/OCTAVE STRING
  188. 27385 PRINT NL$;"";
  189. 27390 I=I+1:IF I=64 OR VL=255 THEN GOSUB 16030:RETURN
  190. 27395 LL=LL+1:IF LL=8 THEN LL=0:PRINT:PRINT"";
  191. 27400 GOTO 27330
  192. 27500 REM NOTE LETTER/OCTAVE STRING
  193. 27510 OV=INT(VL/16):REM OCTAVE
  194. 27520 O$=STR$(OV):O$=RIGHT$(O$,1)
  195. 27530 NL$=L$(VL-OV*16):REM NOTE LETTER NAME
  196. 27540 NL$=NL$+O$:IF LEN(NL$)=2 THEN NL$=NL$+" "
  197. 27550 RETURN
  198. 28000 REM HELP SCREEN
  199. 28010 POKE 53280,5:POKE 53281,5:PRINT"[147]";
  200. 28011 PRINT" PRESS [F7] TO EXIT :                   [176]`````````````````````````````";
  201. 28012 PRINT"[192][192][192][192][192][192][192][192][192][174][221][F][146][144]CHA";
  202. 28013 PRINT"NGEFILENAME}}}}[P]";
  203. 28014 PRINT"[146][144]NEXTPAGE}}[SHIFT] & [P][146][144]PREVIOUSPAGE";
  204. 28015 PRINT"}}}}[+][146][144]INCREAS";
  205. 28016 PRINT"ETEMPO}}[-][146][144]DECREASETEMPO}}";
  206. 28017 PRINT"}}[HOME][146][144]RESETNOTECOUNTERS";
  207. 28018 PRINT"}}}}[146][144]EDITCONTROLS:[CRSR][146]";
  208. 28019 PRINT"[144]MOVECURSOR}}[146][144]`````````````}}[CTRL] &";
  209. 28020 PRINT" [B][146][144]'BEGIN'BLOCKMARK}}[CTRL] & [E][146][144]'END'BLOCKMARK";
  210. 28021 PRINT"}}}}[CTRL] & [D][146][144]DELETE";
  211. 28022 PRINT"BLOCK}}[CTRL] & [W][146][144]WRITEBLOCKATCRSR}}[CTRL] &";
  212. 28023 PRINT" [I][146][144]INSERTBLOCKATCRSR}}";
  213. 28024 PRINT"[221][221][SHIFT] & [CLR][146][144]CLEARCHANNEL[221]";
  214. 28025 PRINT"[173][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192]";
  215. 28026 PRINT"[192][192][192][192][192][192][192][192][192][189]"
  216. 28160 GET K$:IF K$="" THEN 28160
  217. 28170 IF K$<>CHR$(136) THEN 28160
  218. 28180 K$=""
  219. 28190 POKE 53280,0:POKE 53281,0
  220. 28200 GOSUB 27010:REM NOTE EDIT ECREEN
  221. 28210 RETURN
  222. 30000 REM INPUT NEW FILENAME
  223. 30010 POKE 53280,5:POKE 53281,5
  224. 30020 PRINT"[147] ENTER NEW FILENAME : PRESS [RETURN]  [146]";
  225. 30030 PRINT
  226. 30040 PRINT"FILE : ";N$
  227. 30050 PRINT""
  228. 30060 L=14:TB=5:RS=1:GOSUB 32040:REM INPUT SUBROUTINE
  229. 30070 IF A>0 THEN N$=Y$
  230. 30080 POKE 53280,0:POKE 53281,0
  231. 30090 RETURN
  232. 32000 REM INPUT RESTRICTION SUBROUTINE
  233. 32010 REM L=LENGTH OF INPUT
  234. 32020 REM TB=TABULATION OF ROUTINE
  235. 32030 REM RS=CHARACTER RESTRICTIONS
  236. 32040 A=0:Y$="":SP=1
  237. 32050 PRINT TAB(TB+L+1):PRINT"[145][174][157][189][145]";:FOR X=0 TO L+1:PRINT"[157][157] ";:NEXT:PRINT"[145][176][157][173][145][144][164][157]";
  238. 32060 GET X$:IF X$="" THEN 32060
  239. 32070 IF X$=CHR$(160) OR X$=" " OR X$=CHR$(20) OR X$=CHR$(13) THEN 32130
  240. 32080 IF RS=0 THEN IF X$=>"0" AND X$=<"9" THEN 32130
  241. 32090 IF RS=1 AND X$=>CHR$(35) AND X$=<CHR$(93) THEN 32130
  242. 32100 GOTO 32060
  243. 32110 IF A=L-1 THEN PRINT"[157][157]";
  244. 32120 GOTO 32060
  245. 32130 IF X$=CHR$(20) AND A=0 THEN 32060
  246. 32140 IF X$=CHR$(13) AND RIGHT$(Y$,1)=" " THEN Y$=LEFT$(Y$,LEN(Y$)-1):A=A-1
  247. 32150 IF X$=CHR$(13) THEN PRINT:RETURN
  248. 32160 A=A+1:IF X$<>CHR$(32) THEN SP=0
  249. 32170 IF A>L AND X$<>CHR$(20) THEN X$="":A=A-1
  250. 32180 IF A<1 THEN X$="":A=0
  251. 32190 IF X$=CHR$(20) THEN PRINT TAB(A)"[157][164] [157][157]";:A=A-2:Y$=LEFT$(Y$,LEN(Y$)-1):GOTO 32110
  252. 32200 IF X$=CHR$(32) AND SP=1 THEN X$="":A=A-1
  253. 32210 IF X$=CHR$(32) THEN SP=SP+1
  254. 32220 Y$=Y$+X$:PRINT X$;:IF A<L THEN PRINT"[164][157]";
  255. 32230 GOTO 32060
  256. 35000 REM MAIN MENU
  257. 35010 PRINT"[147] MOVE CURSOR UP & DOWN:PRESS [RETURN]   [146]"
  258. 35020 PRINT"***MACRO EDITOR***"
  259. 35030 PRINT"V.H.BERRY C.1989"
  260. 35040 PRINT"        [176][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][174]"
  261. 35060 PRINT"            MACRO EDITOR    "
  262. 35070 PRINT"            HARDCOPY        "
  263. 35080 PRINT"            DISK MENU       "
  264. 35090 PRINT"            EXIT PROGRAM    "
  265. 35100 PRINT
  266. 35110 PRINT"        [173][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][189]"
  267. 35120 PRINT"":T1=10:LL=3:GOSUB 39010:REM MENU SYSTEM ROUTINE
  268. 35130 IF A=3 THEN RETURN
  269. 35140 ON A+1 GOSUB 15010,36010,37020
  270. 35150 GOTO 35010
  271. 36000 REM HARDCOPY MENU
  272. 36010 PRINT"[147] MOVE CURSOR UP & DOWN:PRESS [RETURN]   [146]"
  273. 36020 PRINT"***   HARDCOPY    ***"
  274. 36030 PRINT"FILE : ";N$
  275. 36040 PRINT"        [176][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][174]"
  276. 36050 PRINT"            NEW FILENAME    "
  277. 36060 PRINT"            HORIZONTAL PRINT"
  278. 36070 PRINT"            VERTICAL PRINT  "
  279. 36080 PRINT"            EXIT MENU       "
  280. 36090 PRINT"        [173][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][189]"
  281. 36100 PRINT"":T1=10:LL=3:GOSUB 39010:REM MENU SYSTEM ROUTINE
  282. 36110 IF A=3 THEN RETURN
  283. 36120 ON A+1 GOSUB 30010,46010,47010
  284. 36130 GOTO 36010
  285. 37000 REM DISK MENU
  286. 37020 PRINT"[147] MOVE CURSOR UP & DOWN:PRESS [RETURN]   [146]"
  287. 37030 PRINT"***   DISK MENU   ***"
  288. 37040 PRINT"FILE : ";N$
  289. 37050 PRINT"        [176][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][174]"
  290. 37060 PRINT"            NEW FILENAME    "
  291. 37070 PRINT"            LOAD SID        "
  292. 37090 PRINT"            LOAD MUSIC      "
  293. 37095 PRINT"            APPEND MUSIC    "
  294. 37100 PRINT"            SAVE MUSIC      "
  295. 37110 PRINT"            DISK COMMANDS   "
  296. 37120 PRINT"            EXIT MENU       "
  297. 37130 PRINT
  298. 37140 PRINT"        [173][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][189]"
  299. 37150 PRINT"":T1=10:LL=6:GOSUB 39010:REM MENU SYSTEM ROUTINE
  300. 37160 IF A=6 THEN RETURN
  301. 37165 IF A>0 AND A<6 AND MF=1 THEN GOSUB 6010:REM TURN OFF SEQUENCER
  302. 37170 ON A+1 GOSUB 30010,42010,40010,40010,41010,45010
  303. 37180 GOTO 37020
  304. 38000 REM DISK COMMAND MENU
  305. 38010 PRINT"[147] MOVE CURSOR UP & DOWN:PRESS [RETURN]   [146]"
  306. 38020 PRINT"***DISK COMMANDS***"
  307. 38030 PRINT"FILE : ";N$
  308. 38040 PRINT"        [176][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][174]"
  309. 38045 PRINT"            DISK DIRECTORY  "
  310. 38050 PRINT"            INTIALISE DISK  "
  311. 38060 PRINT"            SCRATCH SID     "
  312. 38070 PRINT"            SCRATCH MUSIC   "
  313. 38080 PRINT"            SCRATCH BOTH    "
  314. 38090 PRINT"            VALIDATE DISK   "
  315. 38100 PRINT"            EXIT MENU       "
  316. 38110 PRINT
  317. 38120 PRINT"        [173][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][189]"
  318. 38130 PRINT"":T1=10:LL=6:GOSUB 39010:REM MENU SYSTEM ROUTINE
  319. 38140 RETURN
  320. 38500 REM DIRECTORY MENU
  321. 38505 IF DY*12>FI THEN DY=0
  322. 38510 PRINT"[147] MOVE CURSOR UP & DOWN:PRESS [RETURN]   [146]"
  323. 38520 PRINT"***DISK DIRECTORY***"
  324. 38525 PRINT"BLOCKS FREE : ";BF
  325. 38530 PRINT"        [176][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][174]"
  326. 38540 PRINT"            ";N$;""
  327. 38550 FOR I=12*DY TO 11+(12*DY)
  328. 38555 IF I>FI THEN PRINT:GOTO 38570
  329. 38560 PRINT"            ";FI$(I)
  330. 38570 NEXT I
  331. 38575 PRINT"            NEXT PAGE"
  332. 38580 PRINT"        [173][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][189]"
  333. 38590 PRINT"":T1=10:LL=13:GOSUB 39010:REM MENU SYSTEM ROUTINE
  334. 38592 IF A=13 THEN DY=DY+1:GOTO 38505
  335. 38593 IF A=0 THEN 38600
  336. 38594 IF LEN(FI$((A-1)+12*DY))<3 THEN 38600
  337. 38595 N$=LEFT$(FI$((A-1)+12*DY),LEN(FI$((A-1)+12*DY))-2)
  338. 38600 RETURN
  339. 39000 REM MENU SYSTEM ROUTINE
  340. 39010 A=0:PRINT TAB(T1);">"
  341. 39020 GET X$:IF X$="" THEN 39020
  342. 39030 IF A=LL AND X$=CHR$(17) THEN A=A-1:PRINT"[145][145]"
  343. 39040 IF A=0 AND X$=CHR$(145) THEN A=A+1:PRINT
  344. 39050 IF X$=CHR$(17) THEN A=A+1:PRINT TAB(T1);"[145] [157]>"
  345. 39060 IF X$=CHR$(145) THEN A=A-1:PRINT TAB(T1);"[145] [157][145]>"
  346. 39070 IF X$=CHR$(13) THEN RETURN
  347. 39080 GOTO 39020
  348. 40000 REM LOAD MUSIC FILE
  349. 40010 X$=".1":I=0:FG=0:IF A=3 THEN FG=1
  350. 40020 N=0:IF FG=1 THEN N=N(I+1)
  351. 40030 OPEN 15,8,15
  352. 40040 OPEN 2,8,2,N$+X$+",S,R"
  353. 40050 INPUT#15,EN,ER$,TR,SE
  354. 40060 IF EN<>0 THEN PRINT"[147] LOAD[146]";:GOTO 44010
  355. 40070 PRINT" LOADING MUSIC FILE :                [146]";
  356. 40080 INPUT#2,A
  357. 40090 POKE CH+I*256+N,A
  358. 40095 IF N=255 THEN POKE CH+I*256+N,255:GOTO 40110
  359. 40100 IF A<>255 THEN N=N+1:GOTO 40080
  360. 40110 N(I+1)=N
  361. 40120 CLOSE 2
  362. 40130 CLOSE 15
  363. 40140 IF I=0 THEN I=1:X$=".2":GOTO 40020
  364. 40150 IF I=1 THEN I=2:X$=".3":GOTO 40020
  365. 40160 RETURN
  366. 41000 REM SAVE MUSIC FILE
  367. 41010 X$=".1":I=0
  368. 41020 N=0
  369. 41030 OPEN 15,8,15
  370. 41040 OPEN 2,8,2,N$+X$+",S,W"
  371. 41050 INPUT#15,EN,ER$,TR,SE
  372. 41060 IF EN<>0 THEN PRINT"[147] SAVE[146]";:GOTO 44010
  373. 41070 PRINT" SAVING MUSIC FILE :                 [146]";
  374. 41080 A=PEEK(CH+I*256+N)
  375. 41090 PRINT#2,A
  376. 41100 IF A<>255 THEN N=N+1:GOTO 41080
  377. 41110 CLOSE 2
  378. 41120 CLOSE 15
  379. 41130 IF I=0 THEN I=1:X$=".2":GOTO 41020
  380. 41140 IF I=1 THEN I=2:X$=".3":GOTO 41020
  381. 41150 RETURN
  382. 42000 REM LOAD FSID REGISTERS
  383. 42010 OPEN 15,8,15
  384. 42020 OPEN 2,8,2,N$+".S,S,R"
  385. 42030 INPUT#15,EN,ER$,TR,SE
  386. 42040 IF EN<>0 THEN PRINT"[147] LOAD[146]";:GOTO 44010
  387. 42050 PRINT" LOADING SOUND FILE :                [146]";
  388. 42060 INPUT#2,A
  389. 42070 POKE 49275,A
  390. 42080 FOR CE=0 TO 2
  391. 42090 FOR REG=0 TO 6
  392. 42100 INPUT#2,A
  393. 42110 POKE FSID+REG+7*CE,A
  394. 42120 NEXT REG,CE
  395. 42130 CLOSE 2
  396. 42140 CLOSE 15
  397. 42150 RETURN
  398. 44000 REM FILE ERROR ROUTINE
  399. 44010 CLOSE 2:CLOSE 15
  400. 44020 PRINT" ERROR : PRESS [RETURN]          [146]";:PRINT
  401. 44030 PRINT"FILE : ";N$
  402. 44040 PRINT"ERROR # : ";EN:PRINT"";ER$:PRINT"TR = ";TR;" : SE = ";SE
  403. 44050 GET K$:IF K$<>CHR$(13) THEN 44050
  404. 44060 RETURN
  405. 45000 REM DISK ROUTINES
  406. 45010 OPEN 15,8,15
  407. 45020 GOSUB 38010:REM DISK COMMAND MENU
  408. 45030 IF A=6 THEN CLOSE 15:RETURN
  409. 45035 IF MF=1 THEN GOSUB 6010:REM TURN OFF SEQUENCER
  410. 45037 IF A=0 THEN GOSUB 45300:GOSUB 38510:GOTO 45020:REM DIRECTORY
  411. 45040 IF A>1 THEN 45080
  412. 45050 PRINT" INTIALISE DISK :                    [146]"
  413. 45060 PRINT#15,"I"
  414. 45070 GOTO 45020
  415. 45080 IF A<>5 THEN 45120
  416. 45090 PRINT" VALIDATE DISK :                     [146]"
  417. 45100 PRINT#15,"V"
  418. 45110 GOTO 45020
  419. 45120 IF A=2 THEN 45160
  420. 45125 PRINT" SCRATCH MUSIC FILE :                [146]"
  421. 45130 PRINT#15,"S:"+N$+".1"
  422. 45132 PRINT#15,"S:"+N$+".2"
  423. 45134 PRINT#15,"S:"+N$+".3"
  424. 45150 IF A=3 THEN 45020
  425. 45160 PRINT" SCRATCH SOUND FILE :                [146]"
  426. 45170 PRINT#15,"S:"+N$+".S"
  427. 45180 GOTO 45020
  428. 45200 REM DISK DIRECTORY READ
  429. 45300 I=0:FI$(I)=""
  430. 45310 OPEN 1,8,0,"$0"
  431. 45320 GET#1,A$,B$
  432. 45330 GET#1,A$,B$
  433. 45340 GET#1,A$,B$
  434. 45350 C=0
  435. 45360 IF A$<>"" THEN C=ASC(A$)
  436. 45370 IF B$<>"" THEN C=C+ASC(B$)*256
  437. 45380 BF=C
  438. 45390 GET#1,B$:IF ST<>0 THEN 45470
  439. 45400 IF B$<>CHR$(34) THEN 45390
  440. 45410 GET#1,B$:IF B$<>CHR$(34) THEN FI$(I)=FI$(I)+B$:GOTO 45410
  441. 45420 GET#1,B$:IF B$=CHR$(32) THEN 45420
  442. 45425 IF RIGHT$(FI$(I),2)=".1" THEN FI$(I)=LEFT$(FI$(I),LEN(FI$(I))-1)+"M":I=I+1
  443. 45426 IF RIGHT$(FI$(I),2)=".S" THEN I=I+1
  444. 45427 IF I=37 THEN 45470
  445. 45430 C$="":FI$(I)=""
  446. 45440 C$=C$+B$:GET#1,B$:IF B$<>"" THEN 45440
  447. 45450 IF ST=0 THEN 45330
  448. 45460 CLOSE 1
  449. 45470 FI=I:DY=0
  450. 45480 CLOSE 1:RETURN
  451. 46000 REM HORIZONTAL HARDCOPY
  452. 46010 OPEN 4,4
  453. 46012 PRINT#4,CHR$(27);CHR$(108);CHR$(6):REM LEFT MARGIN (COL=6)
  454. 46020 PRINT#4,"FILE: ";N$
  455. 46030 FOR OS=1 TO 3
  456. 46040 PRINT#4,CHR$(13)
  457. 46042 PRINT#4,"CHANNEL:";OS
  458. 46044 PRINT#4,CHR$(13);PC$;
  459. 46046 J=0:GOSUB 46210:REM PRINT NOTE#
  460. 46051 FOR I=0 TO N(OS)-1
  461. 46052 VL=PEEK(CH+(OS-1)*256+I)
  462. 46054 IF VL=128 THEN NL$="R  ":GOTO 46066:REM REST
  463. 46060 GOSUB 27510:REM NOTE/OCTAVE STRING
  464. 46066 PRINT#4,NL$;" ";
  465. 46068 LL=LL+1:IF LL=16 THEN J=J+4:GOSUB 46210:REM NEXT LINE
  466. 46070 NEXT I
  467. 46075 PRINT#4,CHR$(13)
  468. 46080 NEXT OS
  469. 46085 PRINT#4,CHR$(12)
  470. 46090 CLOSE 4
  471. 46100 RETURN
  472. 46200 REM PRINT NOTE#
  473. 46210 LL=0:Y$=MID$(PS$,J+1,4)
  474. 46220 PRINT#4,CHR$(13)
  475. 46230 PRINT#4,Y$;"  ";
  476. 46250 RETURN
  477. 47000 REM VERTICAL HARDCOPY
  478. 47010 OPEN 4,4
  479. 47012 PRINT#4,CHR$(27);CHR$(108);CHR$(4):REM LEFT MARGIN (COL=4)
  480. 47020 PRINT#4,"FILE: ";N$
  481. 47025 J=0
  482. 47030 GOSUB 46210:REM PRINT NOTE#
  483. 47035 PRINT#4,CHR$(13);"  ";PC$;
  484. 47040 FOR OS=1 TO 3
  485. 47042 PRINT#4,CHR$(13)
  486. 47043 PRINT#4,"CHAN";OS;" ";
  487. 47050 VL=PEEK(CH+(OS-1)*256+LL+J*4)
  488. 47060 IF LL+J*4>=N(OS) THEN 47110:REM ABORT LINE
  489. 47070 IF VL=128 THEN NL$="R  ":GOTO 47090:REM REST
  490. 47080 GOSUB 27510:REM NOTE/OCTAVE STRING
  491. 47090 PRINT#4,NL$;" ";
  492. 47100 LL=LL+1:IF LL<16 THEN 47050
  493. 47110 LL=0
  494. 47120 NEXT OS
  495. 47130 J=J+4
  496. 47140 IF J*4<N(1) OR J*4<N(2) OR J*4<N(3) THEN 47030
  497. 47150 PRINT#4,CHR$(12)
  498. 47160 CLOSE 4
  499. 47170 RETURN
  500. 50000 REM INITIALISATION
  501. 50010 IF PEEK(51712)=1 THEN 50112:REM MACHINE CODE PRESENT
  502. 50020 REM LOAD MACHINE CODE
  503. 50030 POKE 53280,5:POKE 53281,5
  504. 50040 PRINT"[147][176][174]"
  505. 50050 PRINT"MACRO EDITOR"
  506. 50060 PRINT"V.H.BERRYC.1989"
  507. 50070 PRINT"[173][189]"
  508. 50080 PRINT"LOADINGMACHINECODE"
  509. 50090 FG=FG+1:IF FG=1 THEN LOAD"SEQUENCER MC",8,1
  510. 50100 IF FG=2 THEN LOAD "NOTE TABLE MC",8,1
  511. 50112 DIM FI$(36)
  512. 50115 DIM L$(11):REM NOTE LETTER NAMES
  513. 50120 CH=51968:REM MUSIC DATA ADDRESS
  514. 50140 FSID=49175:REM FALSE SID DATA ADDRESS
  515. 50150 NH=51712:REM NOTE TABLE HIGH BYTE
  516. 50160 NL=51840:REM NOTE TABLE LOW BYTE
  517. 50170 MF=0:RF=0:REM MUSIC & RECORD FLAG
  518. 50210 N$="MUSIC FILE"
  519. 50220 PC$="NOTE# +1  +2  +3  +4  +5  +6  +7  +8  +9  +10 +11 +12 +13 +14 +15"
  520. 50230 PC$=PC$+" +16"
  521. 50240 PS$="+0  +16 +32 +48 +64 +80 +96 +112+128+144+160+176+192+208+224+240"
  522. 50282 REM READ NOTE LETTER NAMES
  523. 50284 FOR I=0 TO 11
  524. 50286 READ A$
  525. 50288 L$(I)=A$
  526. 50289 NEXT
  527. 50290 FOR OS=1 TO 3
  528. 50300 GOSUB 16540:REM CLEAR CHANNEL DATA
  529. 50310 NEXT
  530. 50320 OS=1:REM EDIT VOICE 1
  531. 50330 POKE 53280,0:POKE 53281,0
  532. 50340 RETURN
  533. 60200 REM NOTE LETTER NAME DATA
  534. 60210 DATA "C","C#","D","D#"
  535. 60220 DATA "E","F","F#","G"
  536. 60230 DATA "G#","A","A#","B"
  537.